const vscode = require('vscode');
const fs = require('fs').promises;
const path = require('path');
const ProjectAnalyzer = require('./projectAnalyzer');

/**
 * 文件创建器，用于智能确定文件位置并生成相应的代码文件
 */
class FileCreator {
    constructor(workspaceRoot) {
        this.workspaceRoot = workspaceRoot;
        this.analyzer = new ProjectAnalyzer();
        this.fileTypes = new Map([
            ['.js', { type: 'JavaScript', template: this.getJsTemplate }],
            ['.ts', { type: 'TypeScript', template: this.getTsTemplate }],
            ['.jsx', { type: 'React JSX', template: this.getReactJsxTemplate }],
            ['.tsx', { type: 'React TSX', template: this.getReactTsxTemplate }],
            ['.vue', { type: 'Vue', template: this.getVueTemplate }],
            ['.css', { type: 'CSS', template: this.getCssTemplate }],
            ['.scss', { type: 'SCSS', template: this.getScssTemplate }],
            ['.html', { type: 'HTML', template: this.getHtmlTemplate }],
            ['.json', { type: 'JSON', template: this.getJsonTemplate }],
            ['.md', { type: 'Markdown', template: this.getMarkdownTemplate }]
        ]);
    }

    async initialize() {
        await this.analyzer.initialize(this.workspaceRoot);
        return this;
    }

    /**
     * 智能创建文件
     * @param {string} fileName - 文件名
     * @param {string} content - 文件内容
     * @param {string} targetDir - 目标目录（可选）
     */
    async createFile(fileName, content, targetDir = null) {
        try {
            // 确定文件类型
            const fileExt = path.extname(fileName);
            const fileType = this.fileTypes.get(fileExt) || { type: '未知类型', template: () => '' };
            
            // 确定文件路径
            let filePath;
            if (targetDir) {
                // 使用指定目录
                filePath = path.join(this.workspaceRoot, targetDir, fileName);
            } else {
                // 智能确定文件路径
                filePath = await this.determineFilePath(fileName, fileType.type);
            }
            
            // 确保目录存在
            await fs.mkdir(path.dirname(filePath), { recursive: true });
            
            // 写入文件
            await fs.writeFile(filePath, content);
            
            // 在VS Code中打开该文件
            const uri = vscode.Uri.file(filePath);
            await vscode.window.showTextDocument(uri);
            
            return {
                success: true,
                path: filePath,
                relativePath: path.relative(this.workspaceRoot, filePath)
            };
        } catch (error) {
            return {
                success: false,
                error: error.message
            };
        }
    }

    /**
     * 智能确定文件路径
     * @param {string} fileName - 文件名
     * @param {string} fileType - 文件类型
     */
    async determineFilePath(fileName, fileType) {
        // 分析项目结构
        const structure = this.analyzer.fileStructure;
        
        // 根据文件类型判断合适的位置
        switch (fileType) {
            case 'JavaScript':
            case 'TypeScript':
                // 检查是否有src目录
                if (structure.src) {
                    return path.join(this.workspaceRoot, 'src', fileName);
                }
                break;
                
            case 'React JSX':
            case 'React TSX':
                // 查找组件目录
                if (structure.src && structure.src.components) {
                    return path.join(this.workspaceRoot, 'src', 'components', fileName);
                } else if (structure.components) {
                    return path.join(this.workspaceRoot, 'components', fileName);
                } else if (structure.src) {
                    return path.join(this.workspaceRoot, 'src', fileName);
                }
                break;
                
            case 'Vue':
                // 查找Vue组件目录
                if (structure.src && structure.src.components) {
                    return path.join(this.workspaceRoot, 'src', 'components', fileName);
                } else if (structure.components) {
                    return path.join(this.workspaceRoot, 'components', fileName);
                } else if (structure.src) {
                    return path.join(this.workspaceRoot, 'src', fileName);
                }
                break;
                
            case 'CSS':
            case 'SCSS':
                // 查找样式目录
                if (structure.src && structure.src.styles) {
                    return path.join(this.workspaceRoot, 'src', 'styles', fileName);
                } else if (structure.styles) {
                    return path.join(this.workspaceRoot, 'styles', fileName);
                } else if (structure.src && structure.src.css) {
                    return path.join(this.workspaceRoot, 'src', 'css', fileName);
                } else if (structure.css) {
                    return path.join(this.workspaceRoot, 'css', fileName);
                } else if (structure.src) {
                    return path.join(this.workspaceRoot, 'src', fileName);
                }
                break;
                
            case 'HTML':
                // 查找HTML目录或根目录
                if (structure.public) {
                    return path.join(this.workspaceRoot, 'public', fileName);
                } else if (structure.src) {
                    return path.join(this.workspaceRoot, 'src', fileName);
                }
                break;
                
            case 'JSON':
                // 配置文件通常在根目录
                return path.join(this.workspaceRoot, fileName);
                
            case 'Markdown':
                // 文档通常在根目录或docs目录
                if (structure.docs) {
                    return path.join(this.workspaceRoot, 'docs', fileName);
                }
                break;
        }
        
        // 默认放在根目录
        return path.join(this.workspaceRoot, fileName);
    }

    // 文件模板
    getJsTemplate(fileName) {
        const name = path.basename(fileName, '.js');
        return `/**
 * ${name}
 */

'use strict';

// 模块导入

// 主要功能实现

// 导出模块
module.exports = {
    // 添加导出内容
};
`;
    }

    getTsTemplate(fileName) {
        const name = path.basename(fileName, '.ts');
        return `/**
 * ${name}
 */

// 类型定义

// 接口定义
interface I${name} {
    // 添加接口属性
}

// 主要功能实现
class ${name} implements I${name} {
    // 实现接口
}

// 导出模块
export default ${name};
`;
    }

    getReactJsxTemplate(fileName) {
        const name = path.basename(fileName, '.jsx');
        return `import React from 'react';

/**
 * ${name} 组件
 */
const ${name} = (props) => {
    return (
        <div className="${name.toLowerCase()}">
            {/* 组件内容 */}
        </div>
    );
};

export default ${name};
`;
    }

    getReactTsxTemplate(fileName) {
        const name = path.basename(fileName, '.tsx');
        return `import React from 'react';

interface ${name}Props {
    // 组件属性定义
}

/**
 * ${name} 组件
 */
const ${name}: React.FC<${name}Props> = (props) => {
    return (
        <div className="${name.toLowerCase()}">
            {/* 组件内容 */}
        </div>
    );
};

export default ${name};
`;
    }

    getVueTemplate(fileName) {
        const name = path.basename(fileName, '.vue');
        return `<template>
    <div class="${name.toLowerCase()}">
        <!-- 组件内容 -->
    </div>
</template>

<script>
export default {
    name: '${name}',
    props: {
        // 组件属性
    },
    data() {
        return {
            // 响应式数据
        };
    },
    methods: {
        // 组件方法
    }
};
</script>

<style scoped>
/* 组件样式 */
.${name.toLowerCase()} {
    /* 样式定义 */
}
</style>
`;
    }

    getCssTemplate(fileName) {
        const name = path.basename(fileName, '.css');
        return `/**
 * ${name} 样式
 */

/* 全局样式 */

/* 组件样式 */
.${name.toLowerCase()} {
    /* 样式定义 */
}
`;
    }

    getScssTemplate(fileName) {
        const name = path.basename(fileName, '.scss');
        return `/**
 * ${name} 样式
 */

// 变量定义
$primary-color: #333;

// 混合定义
@mixin flex-center {
    display: flex;
    justify-content: center;
    align-items: center;
}

// 组件样式
.${name.toLowerCase()} {
    color: $primary-color;
    @include flex-center;
}
`;
    }

    getHtmlTemplate(fileName) {
        const name = path.basename(fileName, '.html');
        return `<!DOCTYPE html>
<html lang="zh-CN">
<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>${name}</title>
    <link rel="stylesheet" href="styles.css">
</head>
<body>
    <div class="container">
        <!-- 页面内容 -->
    </div>
    
    <script src="main.js"></script>
</body>
</html>
`;
    }

    getJsonTemplate(fileName) {
        const name = path.basename(fileName, '.json');
        return `{
    "name": "${name}",
    "version": "1.0.0",
    "description": ""
}
`;
    }

    getMarkdownTemplate(fileName) {
        const name = path.basename(fileName, '.md');
        return `# ${name}

## 简介

## 内容

## 总结
`;
    }
}

module.exports = FileCreator; 